/**
 * @Copyright:Copyright (c) 2007 - 2023
 */
package com.tengtong.duang.app.query;

import java.util.Map;

import com.tengtong.commons.lang.ExceptionUtils;
import com.tengtong.commons.lang.StringUtils;
import com.tengtong.duang.app.query.core.FieldDelimiter;

/**
 * 查询表达式构建服务
 *
 * @author lin_jinming
 * @since: v1.0
 */
public class AppQueryBuildService {

    /**
     * 分析表达式，得到一个构建器
     *
     * @param delimiter
     * @param statement
     * @return
     */
    public static Object parse(FieldDelimiter delimiter, Map<String, Object> statement) {
        if(statement.isEmpty()) {
            throw ExceptionUtils.ofRuntime("表达式或语句不能为空");
        }
        
        statement.forEach((n, v)->{
            if(StringUtils.isNullOrEmpty(n)) {
                throw ExceptionUtils.ofRuntime("表达式或语句键值不能为空");
            }

            var name = StatementName.getByID(n);
            
            switch (name) {
                case RelationQuery -> {
                    
                }
                default -> {
                    
                }
            }
            
        });
        
        return null;
    }
    
    /**
     * 语句名称枚举
     *
     *
     * @author lin_jinming
     * @since: v1.0
     */
    public static enum StatementName {
        
        StandardQuery(""),              // 单表查询
        
        RelationQuery("[]")             // 多表关联查询（包括连接）
        
        ;
        
        private String id;
        
        StatementName(String id) {
            this.id = id;
        }
        
        /**
         * 通过 id 获取
         *
         * @param s
         * @return
         */
        public static StatementName getByID(String s) {
            if(StringUtils.isNullOrEmpty(s)) {
                return null;
            }
            
            for(var n: values()) {
                if(StringUtils.equalsIgnoreCase(s, n.id)) {
                    return n;
                }
            }
            
            return null;
        }
        
        /**
         * 使用名称来获取枚举值
         *
         * @param n
         * @return
         */
        public static StatementName fromValue(String n) {
            if(StringUtils.isNullOrEmpty(n)) {
                return null;
            }
            
            for(var v: values()) {
                if(StringUtils.equalsIgnoreCase(n, v.name())) {
                    return v;
                }
            }
            
            return null;
        }
    }
}
